// 静态成员分为静态方法和静态属性

// 静态方法和静态属性不能用this调用，只能通过类名.调用
class Car {
    static others: any;
    name: string;
    price: number;

    constructor(name: string, price: number, other: any) {
        this.name = name;
        this.price = price;
        Car.others = other;
        this.nihao();
    }

    static sayhellow() {
        console.log("hellow");
    }

    nihao() {
        console.log("你好");
    }
}

const bmw = new Car("bmw", 10, {chaiel: "徐州"});
console.log(bmw.name);
// console.log(bmw.others);//报错

console.log(Car.others);
Car.sayhellow();
// bmw.sayhellow()//报错

// 静态代码块
// 静态成员分为静态方法和静态属性

// 静态方法和静态属性不能用this调用，只能通过类名.调用
class Cars {
    static #others: any; //这行代码定义了一个 私有的静态字段。这种语法是 ECMAScript 的私有字段语法，前面带 # 表示该字段只能在类的内部使用。
    name: string;
    price: number;

    constructor(name: string, price: number, other: any) {
        this.name = name;
        this.price = price;
        Cars.#others = other;
    }

    nihao() {
        console.log("你好");
        console.log(Cars.#others);
    }

    static {
        console.log(22);
        try {
            let lastlength = {
                length: 10,
            };
            Cars.#others = lastlength.length;
        } catch {
        }
    }
}

// console.log(Cars.#others);//不能再类外访问 只


const bmws = new Cars("bmw", 10, {chaiel: "静态区块"});
bmws.nihao();


}
// 这是 ES2022 标准中定义的 私有实例字段，特点：
//
// 特性	            说明
// 使用 # 开头	   表示该字段是私有的
// 只能在类内部访问	外部访问将直接抛出语法错误（编译阶段）
// 每个实例独立	   和普通实例字段一样，每个对象有自己的一份
// 非静态字段	      不属于类本身，而是属于类的每个实例
// 是运行时私有的	   和 TypeScript 的 private 不同，它在运行时也是隐藏的
//
// 二、和 TypeScript 的 private 区别
// 项目	       TypeScript 的 private	   ES 的 #字段
// 是否运行时隐藏	❌ 否（运行时还是能访问）	✅ 是
// 是否是真正的私有	❌ 编译私有	✅ 原生私有
// 外部访问会报错	⭕ 报类型错误（TS 检查）	✅ 报语法错误
// 浏览器支持情况	编译后兼容好	需要支持私有字段语法的浏览器
// 可否用于静态字段	✅ 支持 private static	✅ 支持 static #字段



// 2. TypeScript private（编译隐藏）：
// class Car {
//     private secret = "123";
// }
// const c = new Car();
// console.log(c.secret); // ❌ TS 报错，但 JS 编译后其实还是能访问到

// 3. ES 原生私有字段 #secret：
// class Car {
//     #secret = "456";
//     getSecret() {
//         return this.#secret;
//     }
// }
// const c = new Car();
// console.log(c.getSecret()); // ✅ "456"
// console.log(c.#secret);     // ❌ SyntaxError: Private field '#secret' must be declared